package ar.republicagroup.gestion.dao.jpa;
import ar.republicagroup.gestion.dao.LiquidacionDAO;
import ar.republicagroup.gestion.entities.Cliente;
import ar.republicagroup.gestion.entities.Liquidacion;
import ar.republicagroup.gestion.util.JPAUtil;
import ar.republicagroup.gestion.util.messages.UIMessages;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.apache.log4j.Logger;

/**
 *
 * @author DIEGOALV
 */
public class LiquidacionDAOImplJPA implements LiquidacionDAO{
    
        private EntityManager		 em;
        private static Logger log = Logger.getLogger(BolsaChequeDAOImplJPA.class);

        
        
    public LiquidacionDAOImplJPA() {
        em = JPAUtil.getEntityManager();
    }
         
    @Override
    public List<Liquidacion> findEntities() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List<Liquidacion> getLiquidacionsByFilters(Cliente cliente,Date fechaDesde,Date fechaHasta) {
        
        if(!em.isOpen()){ em = JPAUtil.getEntityManager(); }
       
         CriteriaBuilder qb  = em.getCriteriaBuilder();
         CriteriaQuery cq    = qb.createQuery();
	 Root<Liquidacion> liquidacion = cq.from(Liquidacion.class);
         List<Predicate> predicates = new ArrayList<>();
         
         if((fechaDesde != null) && (fechaHasta != null)){
                            fechaDesde.setHours(0);
                            fechaDesde.setMinutes(0);
                            fechaDesde.setSeconds(0);
                            
                            fechaHasta.setHours(23);
                            fechaHasta.setMinutes(59);
                            fechaHasta.setSeconds(59);
                            predicates.add(qb.between(liquidacion.get("fechaLiquidacion").as(Date.class), fechaDesde, fechaHasta));
                            
         }
         
         if(cliente != null){
             predicates.add(qb.equal(liquidacion.get("clienteId"), cliente));
         }
         cq.select(liquidacion)
		            .where(predicates.toArray(new Predicate[]{}));
         cq.orderBy(qb.desc(liquidacion.get("fechaRegistro").as(Date.class)));
         return em.createQuery(cq).getResultList();
    }

    @Override
    public String insert(Liquidacion beanLiquidacion) {
             if(!em.isOpen()){ em = JPAUtil.getEntityManager(); }
                    String resultado = null;
                    try{
			em.getTransaction().begin();
			em.persist(beanLiquidacion);
                        em.getTransaction().commit();
			resultado = "Se registró la liquidación correctamente";
                        log.info("Insertando liquidación... Cliente:"+beanLiquidacion.getClienteId().getNombre());
                        }catch(Exception ex){
                            log.error(ex.getMessage());
                            em.getTransaction().rollback();
                        }
		
                    finally{
                        em.close();
                    }       
                    
                    return resultado;
    }

    @Override
    public String update(Liquidacion beanLiquidacion) {
            if(!em.isOpen()){ em = JPAUtil.getEntityManager(); }
                
                String resultado = null;
                
                try{
                    em.getTransaction().begin();
                    em.merge(beanLiquidacion);
                    em.getTransaction().commit();
                    resultado = UIMessages.getInfoMessage("onCompleteUpdate");
                    log.info("Actualizando liquidación...");
                }catch(Exception ex){
                    log.error(ex.getMessage());
                    em.getTransaction().rollback();
                }
            
            return resultado;
    }

    @Override
    public Liquidacion get(Integer id_cheque) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String delete(Integer id_cheque) {
        throw new UnsupportedOperationException("Not supported yet.");
    }    

    @Override
    public Liquidacion getLastLiquidacionByCliente(Cliente cliente) {
        
        if(!em.isOpen()){ em = JPAUtil.getEntityManager(); }
        
        Liquidacion lastLiquidacion = null;
        
        String mysqlQuery   = "SELECT MAX(id) FROM liquidacion WHERE cliente_id = ?";
        Query query1        = em.createNativeQuery(mysqlQuery);
        query1.setParameter(1, cliente.getId());
        Object resultQuery1 =  query1.getSingleResult(); 
        
        if( resultQuery1 != null ){
            lastLiquidacion = em.find(Liquidacion.class, resultQuery1);
        }
        
        return lastLiquidacion;
    }
}
